package cn.kgc.ffzw.fuxi.link;



public class MyMap {

    private MyLink []table;

    private static int DEFAULT_TABLE_CAPACITY=16;
    private int size;
    private int POW=4;
    private double FILLDIVISOR=0.75;
    public MyMap(){
        this.table=new MyLink[DEFAULT_TABLE_CAPACITY]
        ;
    }


    /**
     *
     */

    public void put(Object key,Object value){
        //计算下标
        int flag=calaFlag(key);
        //检查容量

        MyLink link=null;

        if(table[flag]==null){
            MyLink lk=new MyLink();
            link.add(key, value);
            table[flag]=link;
        }else{
            //MyLink lk=table[flag];
            link=table[flag];
        }
        //查找表中是个否有相同的键
        MyLink.Entry mod=null;
        for (int i = 0; i < link.getSize(); i++) {
            if(link.indexOf(i).getKey()==key){
                mod=link.indexOf(i);
                mod.setValye(value);
                break;
            }
        }
        if (mod==null){
            link.add(key,value);
        }
        table[flag]=link;
    }

    //删除
    public void remove(Object key){
        //获取桶表下标
        final int flag=calaFlag(key);
        //在桶表上找对应元素
        MyLink link=table[flag];

        //检查桶表上是否存在
        if(link != null){
            for(int i = 0; i < link.getSize(); i++) {
                MyLink.Entry tmp=link.indexOf(i);
                link.remove(i);
                break;
            }
        }
    }




    private void CalaCapactive(int flag){
        //容量不够就扩容
        MyLink link=table[flag];

        if(DEFAULT_TABLE_CAPACITY*FILLDIVISOR<link.getSize()){
            resize();
        }


    }
    private void resize(){
        //新的桶数组建立

        //重写这是初始化参数
        POW++;
        DEFAULT_TABLE_CAPACITY=DEFAULT_TABLE_CAPACITY<<1;

        size=0;
        //将原桶表保存到oleTag中；
        MyLink []newTab=new MyLink[DEFAULT_TABLE_CAPACITY];

        //将元map中的数据提取出来，并重新放到新的tab中
        for (int i = 0; i < table.length; i++) {
            if(table[i]==null){
                continue;
            }
            for (int j = 0; j < table[i].getSize(); j++) {
                final MyLink.Entry entry = table[i].indexOf(j);
                //将数据取出来存放到新的数组中
                put(entry.getKey(),entry.getValye());

            }
        }
    }

    /**
     *计算下标的核心公式
     * @param key
     * @return
     */
    private int calaFlag(Object key){
        if (key == null) {
            return 0;
        }

        return key.hashCode()&((1<<POW)-1);
    }
}

